Prepare data

Read and format data

Prevalence


df_uk_covid <- read_csv('timeseries_uk_utla_march9_april_09.csv')
Parsed with column specification:
cols(
  ut_area = col_character(),
  time = col_double(),
  areaname = col_character(),
  open = col_double(),
  extra = col_double(),
  agree = col_double(),
  neuro = col_double(),
  sci = col_double(),
  frequ = col_double(),
  ut_name = col_character(),
  poptotal = col_double(),
  rate_day = col_double()
)
df_uk <- df_uk_covid %>% filter(time <=22) %>% 
  dplyr::rename(pers_o = open, 
         pers_c = sci,
         pers_e = extra,
         pers_a = agree,
         pers_n = neuro) %>%
  select(-ut_name, -areaname, -poptotal) %>%
  drop_na()

df_uk %>% head()
NA

Social distancing


df_uk_socdist <- read_csv('UK_socdist_fb_nuts3.csv')
Parsed with column specification:
cols(
  nuts3 = col_character(),
  date = col_date(format = ""),
  all_day_bing_tiles_visited_relat = col_double(),
  all_day_ratio_single_tile_users = col_double(),
  open = col_double(),
  extra = col_double(),
  agree = col_double(),
  neuro = col_double(),
  sci = col_double(),
  frequ = col_double(),
  nuts3_name = col_character(),
  runday = col_double()
)
df_uk_socdist <- df_uk_socdist %>% select(-runday) %>%
  filter(date >= '2020-03-09' & date <= '2020-03-31') %>%
  group_by(nuts3) %>% 
  mutate(time = row_number()) %>%
  ungroup() %>% 
  dplyr::rename(pers_o = open, 
                pers_c = sci,
                pers_e = extra,
                pers_a = agree,
                pers_n = neuro) %>% 
  select(-nuts3_name) %>% 
  dplyr::rename(socdist_tiles = all_day_bing_tiles_visited_relat,
                socdist_single_tile = all_day_ratio_single_tile_users) %>%
  drop_na()
  
df_uk_socdist %>% head()
NA

Controls

df_uk_ctrl_nuts <- read_csv("controls_UK_nuts3.csv")
Parsed with column specification:
cols(
  nuts3 = col_character(),
  nuts3_name = col_character(),
  airport_dist = col_double(),
  males = col_double(),
  popdens = col_double(),
  manufacturing = col_double(),
  tourism = col_double(),
  health = col_double(),
  academic = col_double(),
  medinc = col_double(),
  medage = col_double(),
  conservative = col_double()
)
df_uk_ctrl_nuts <- df_uk_ctrl_nuts %>% select(-nuts3_name)
df_uk_ctrl_nuts

df_uk_ctrl_ut <- read_csv("controls_UK_ut.csv")
Parsed with column specification:
cols(
  ut_area = col_character(),
  ut_name = col_character(),
  airport_dist = col_double(),
  males = col_double(),
  popdens = col_double(),
  manufacturing = col_double(),
  tourism = col_double(),
  health = col_double(),
  academic = col_double(),
  medinc = col_double(),
  medage = col_double(),
  conservative = col_double()
)
df_uk_ctrl_ut <- df_uk_ctrl_ut %>% select(-ut_name)
df_uk_ctrl_ut
NA
NA

Merge data

Identify London areas


nuts_london_inner <- c('UKI31','UKI32','UKI33','UKI34','UKI41',
                      'UKI42','UKI43','UKI44','UKI45')

nuts_london_outer <- c('UKI51','UKI52','UKI53','UKI54','UKI61',
                      'UKI62','UKI63','UKI71','UKI72','UKI73',
                      'UKI74','UKI75')

ut_london_inner <- c('E09000007','E09000001','E09000033','E09000013',
                    'E09000020','E09000032','E09000025','E09000012',
                    'E09000030','E09000014','E09000019','E09000023',
                    'E09000028','E09000022')

ut_london_outer <- c('E09000011','E09000004','E09000016','E09000002',
                    'E09000031','E09000026','E09000010','E09000006',
                    'E09000008','E09000029','E09000021','E09000024',
                    'E09000003','E09000005','E09000009','E09000017',
                    'E09000015','E09000018','E09000027')
df_uk_socdist = df_uk_socdist %>% 
  mutate(london = ifelse(nuts3 %in% nuts_london_inner, 'london_inner', 
                       ifelse(nuts3 %in% nuts_london_outer, 'london_outer',
                              'country'))) %>%
  mutate(london = as.factor(london))

df_uk = df_uk %>% 
  mutate(london = ifelse(ut_area %in% ut_london_inner, 'london_inner', 
                       ifelse(ut_area %in% ut_london_outer, 'london_outer',
                              'country'))) %>%
  mutate(london = as.factor(london))

Explore data

Plot prevalence over time


df_uk %>% ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=ut_area, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_uk %>% mutate(prev_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=ut_area, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Plot social distancing over time


df_uk_socdist %>% ggplot(aes(x=time, y=socdist_tiles)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_uk_socdist %>% mutate(socdist_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(socdist_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_tiles)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~socdist_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Explore differences between london and the rest


df_uk %>% ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=ut_area, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  facet_wrap(~london) +
  ggtitle("Overall prevalence over time")

NA
NA
NA
df_uk_socdist %>% ggplot(aes(x=time, y=socdist_tiles)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  facet_wrap(~london) +
  ggtitle("Overall social distancing over time")

Correlations


df_uk %>% group_by(ut_area) %>% 
  summarize_if(is.numeric, mean, na.rm=T) %>% 
  select(-ut_area, -time) %>% 
  cor(use = 'pairwise.complete') %>% round(3)
         pers_o pers_e pers_a pers_n pers_c  frequ poptotal rate_day popdens
pers_o    1.000  0.734 -0.605 -0.144 -0.638  0.008   -0.097    0.646   0.801
pers_e    0.734  1.000 -0.413 -0.500 -0.294  0.065   -0.074    0.556   0.621
pers_a   -0.605 -0.413  1.000 -0.195  0.641  0.131    0.199   -0.585  -0.741
pers_n   -0.144 -0.500 -0.195  1.000 -0.351 -0.243   -0.124   -0.108   0.040
pers_c   -0.638 -0.294  0.641 -0.351  1.000  0.220    0.225   -0.489  -0.729
frequ     0.008  0.065  0.131 -0.243  0.220  1.000    0.949   -0.082  -0.195
poptotal -0.097 -0.074  0.199 -0.124  0.225  0.949    1.000   -0.128  -0.252
rate_day  0.646  0.556 -0.585 -0.108 -0.489 -0.082   -0.128    1.000   0.773
popdens   0.801  0.621 -0.741  0.040 -0.729 -0.195   -0.252    0.773   1.000
df_uk
NA

Modelling

Prepare functions


# function calculates all relevant models
run_models <- function(y, lvl1_x, lvl2_x, lvl2_id, data, ctrls=F){

  # subset data
  data = data %>% 
    dplyr::select(all_of(y), all_of(lvl1_x), all_of(lvl2_x), all_of(lvl2_id), 
                  popdens, all_of(y))
  data = data %>% 
    dplyr::rename(y = all_of(y),
           lvl1_x = all_of(lvl1_x),
           lvl2_x = all_of(lvl2_x),
           lvl2_id = all_of(lvl2_id)
           )
  
  # configure optimization procedure
  ctrl_config <- lmeControl(opt = 'optim', maxIter = 100, msMaxIter = 100)

  # baseline
  baseline <- lme(fixed = y ~ 1, random = ~ 1 | lvl2_id, 
                    data = data,
                    correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept fixed slope
  random_intercept <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                          random = ~ 1 | lvl2_id,
                            data = data,
                            correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept random slope
  random_slope <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                      random = ~ lvl1_x | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction <- lme(fixed = y ~ lvl1_x * lvl2_x, 
                     random = ~ lvl1_x | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction)
  
  
  if (ctrls == 'dem' | ctrls == 'prev'){
    
    # random intercept random slope
    random_slope_ctrl_dem <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens,
                              random = ~ lvl1_x | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_main_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_int_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')        
    
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem)
  }
  
  if (ctrls == 'prev'){
  
    # random intercept random slope
    random_slope_ctrl_prev <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens + rate_day,
                              random = ~ lvl1_x + rate_day | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')  
    
        # cross level interaction
    interaction_ctrl_main_prev <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens + rate_day,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
  
    # cross level interaction
    interaction_ctrl_int_prev<- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens + rate_day,
                             random = ~ lvl1_x + rate_day | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')
  
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem,                    
                    "random_slope_ctrl_prev" = random_slope_ctrl_prev,
                    "interaction_ctrl_main_prev" = interaction_ctrl_main_prev,
                    "interaction_ctrl_int_prev" = interaction_ctrl_int_prev)
  }
  
  if(ctrls == 'exp'){
    # random intercept random slope
  random_slope_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) + lvl2_x, 
                      random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) * lvl2_x, 
                     random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')  
  
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction,                  
                  "random_slope_exp" = random_slope_exp,
                  "interaction_exp" = interaction_exp)
  }
  
  return(results)
        
}

# extracts table with coefficients and tests statistics
extract_results <- function(models) {
  
  models_summary <- models %>% 
  map(summary) %>% 
  map("tTable") %>% 
  map(as.data.frame) %>% 
  map(round, 10) 
  # %>% map(~ .[str_detect(rownames(.), 'Inter|lvl'),])
  
  return(models_summary)
  
}


# calculates comparison of all models in model list
compare_models <- function(models) {

  mdl_names <- models %>% names()
  
  str = ''
  for (i in mdl_names){
    
    mdl_str <- paste('models$', i, sep = '')
    
    if(i == 'baseline'){
      str <- mdl_str
    }else{
    str <- paste(str, mdl_str, sep=', ')
    }
  }
  
  anova_str <- paste0('anova(', str, ')')
  mdl_comp <- eval(parse(text=anova_str))
  rownames(mdl_comp) = mdl_names
  return(mdl_comp)
}

Remove London Data

df_uk <- df_uk %>% filter(london == 'country')
df_uk_socdist <- df_uk_socdist %>% filter(london == 'country')

Rescale Data

df_uk_scaled <- df_uk %>% dplyr::select(ut_area, time, pers_o, 
                                 pers_c, pers_e, pers_e, pers_a, pers_n,
                                 popdens, rate_day) %>%
  mutate_at(vars(-ut_area, -time), scale)

df_uk_scaled %>% head()


df_uk_socdist_scaled <- df_uk_socdist %>% dplyr::select(nuts3, time, pers_o, 
                                 pers_c, pers_e, pers_e, pers_a, pers_n,
                                 popdens, socdist_tiles) %>%
  mutate_at(vars(-nuts3, -time), scale)

df_uk_socdist_scaled %>% head()
NA

Predict prevalence

prevalence ~ openness


models_o_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_o_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_covid)
NA

prevalence ~ conscientiousness


models_c_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_c_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_covid)
NA
NA

prevalence ~ extraversion


models_e_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_e_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_covid)
NA
NA

prevalence ~ agreeableness


models_a_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_a_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_covid)
NA
NA

prevalence ~ neuroticism


models_n_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_n_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_covid)
NA
NA

Predict social distancing

social distancing ~ openness


models_o_socdist <-run_models(y = 'socdist_tiles', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_o_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_socdist)
NA

social distancing ~ conscientiousness


models_c_socdist <-run_models(y = 'socdist_tiles', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_c_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_socdist)
NA
NA

social distancing ~ extraversion


models_e_socdist <-run_models(y = 'socdist_tiles', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_e_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_socdist)
NA
NA

social distancing ~ agreeableness


models_a_socdist <-run_models(y = 'socdist_tiles', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_a_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_socdist)
NA
NA

social distancing ~ neuroticism


models_n_socdist <-run_models(y = 'socdist_tiles', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_n_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_socdist)
NA
NA

prevalence ~ conscientiousness


models_c_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_c_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_c_covid_exp)
NA

prevalence ~ extraversion


models_e_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_e_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_e_covid_exp)
NA

prevalence ~ agreeableness


models_a_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_a_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_a_covid_exp)
NA

prevalence ~ neuroticism


models_n_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_n_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_n_covid_exp)
NA

Create overview table

Define function to create overview tables


summary_table <- function(models, dv_name){

  temp_df_ctrl_main <- NULL
  temp_df_ctrl_int <- NULL
  
  for (i in models){
    results <- i %>% extract_results()
    
    results_ctrl_main <- results$interaction_ctrl_main_dem['lvl1_x:lvl2_x',]
    temp_df_ctrl_main <- temp_df_ctrl_main %>% rbind(results_ctrl_main)
    
    results_ctrl_int <- results$interaction_ctrl_int_dem['lvl1_x:lvl2_x',]
    temp_df_ctrl_int <- temp_df_ctrl_int %>% rbind(results_ctrl_int)
  }
  
  names_ctrl_main <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens')
  names_ctrl_int <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens*time')

  rownames(temp_df_ctrl_main) <- names_ctrl_main
  rownames(temp_df_ctrl_int) <- names_ctrl_int
  
  sum_tab <- rbind(temp_df_ctrl_main, temp_df_ctrl_int) %>% round(4)
  
  return(sum_tab)

} 

Create overview tables

# prevalence
models_prev <- list(models_o_covid, 
                    models_c_covid, 
                    models_e_covid, 
                    models_a_covid, 
                    models_n_covid)

sum_tab_prev <- summary_table(models_prev, dv_name = 'prev')

write.table(sum_tab_prev, quote=F)
Value Std.Error DF t-value p-value
prev~o*time_crtl_popdens 0.0037 0.0038 2413 0.9907 0.3219
prev~c*time_crtl_popdens -0.0177 0.0037 2413 -4.7421 0
prev~e*time_crtl_popdens -0.0033 0.0038 2413 -0.8744 0.382
prev~a*time_crtl_popdens -0.0131 0.0037 2413 -3.5102 5e-04
prev~n*time_crtl_popdens 0.0138 0.0037 2413 3.6925 2e-04
prev~o*time_crtl_popdens*time -0.0026 0.0039 2412 -0.6683 0.504
prev~c*time_crtl_popdens*time -0.0042 0.0051 2412 -0.8169 0.4141
prev~e*time_crtl_popdens*time -0.0049 0.0037 2412 -1.321 0.1866
prev~a*time_crtl_popdens*time -0.0048 0.0041 2412 -1.1739 0.2406
prev~n*time_crtl_popdens*time 0.0074 0.0039 2412 1.8814 0.06
# social distancing
models_socdist <- list(models_o_socdist, 
                       models_c_socdist, 
                       models_e_socdist, 
                       models_a_socdist, 
                       models_n_socdist)

sum_tab_socdist <- summary_table(models_socdist, dv_name = 'socdist')

write.table(sum_tab_socdist, quote=F)
Value Std.Error DF t-value p-value
socdist~o*time_crtl_popdens -4e-04 0.0018 2396 -0.239 0.8111
socdist~c*time_crtl_popdens 8e-04 0.0018 2396 0.4223 0.6728
socdist~e*time_crtl_popdens -0.0012 0.0018 2396 -0.7034 0.4819
socdist~a*time_crtl_popdens 2e-04 0.0018 2396 0.1142 0.9091
socdist~n*time_crtl_popdens 2e-04 0.0018 2396 0.1124 0.9105
socdist~o*time_crtl_popdens*time 0 0.0019 2395 0.0154 0.9877
socdist~c*time_crtl_popdens*time -7e-04 0.0024 2395 -0.2708 0.7866
socdist~e*time_crtl_popdens*time -0.0011 0.0018 2395 -0.6193 0.5358
socdist~a*time_crtl_popdens*time -6e-04 0.002 2395 -0.3054 0.7601
socdist~n*time_crtl_popdens*time 9e-04 0.0019 2395 0.4509 0.6521

Conditional random forest analysis

Extract slopes prevalence

Extract slopes social distancing


# slope socdist
df_uk_slope_socdist <- df_uk_socdist %>% split(.$nuts3) %>%
  map(~ lm(socdist_tiles ~ time, data = .)) %>%
  map(coef) %>%
  map_dbl('time') %>%
  as.data.frame() %>%
  rownames_to_column('nuts3') %>%
  rename(slope_socdist = '.')

# merge with control variables 
df_uk_slope_socdist <- df_uk_socdist %>% select(-time, -date, -socdist_tiles, -all_day_ratio_single_tile_users) %>%
  distinct() %>%
  inner_join(df_uk_slope_socdist, by = 'nuts3')

head(df_uk_slope_socdist)

Explore distribution of slopes

df_uk_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)


df_uk_slope_socdist %>% ggplot(aes(slope_socdist)) + geom_histogram(bins = 100)

LS0tCnRpdGxlOiAiQ09WSUQxOSBVSyIKYXV0aG9yOiAiSGVpbnJpY2ggUGV0ZXJzIgpkYXRlOiAiNC8yMy8yMDIwIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCiMgTUFDCiBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGF0YS9VSycpCiAKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShubG1lKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHh0YWJsZSkKCmBgYAoKIyBQcmVwYXJlIGRhdGEKCiMjIyBSZWFkIGFuZCBmb3JtYXQgZGF0YQoKIyMjIFByZXZhbGVuY2UgCmBgYHtyfQoKZGZfdWtfY292aWQgPC0gcmVhZF9jc3YoJ3RpbWVzZXJpZXNfdWtfdXRsYV9tYXJjaDlfYXByaWxfMDkuY3N2JykKCmRmX3VrIDwtIGRmX3VrX2NvdmlkICU+JSBmaWx0ZXIodGltZSA8PTIyKSAlPiUgCiAgZHBseXI6OnJlbmFtZShwZXJzX28gPSBvcGVuLCAKICAgICAgICAgcGVyc19jID0gc2NpLAogICAgICAgICBwZXJzX2UgPSBleHRyYSwKICAgICAgICAgcGVyc19hID0gYWdyZWUsCiAgICAgICAgIHBlcnNfbiA9IG5ldXJvKSAlPiUKICBzZWxlY3QoLXV0X25hbWUsIC1hcmVhbmFtZSwgLXBvcHRvdGFsKSAlPiUKICBkcm9wX25hKCkKCmRmX3VrICU+JSBoZWFkKCkKCmBgYAoKIyMjIFNvY2lhbCBkaXN0YW5jaW5nCmBgYHtyfQoKZGZfdWtfc29jZGlzdCA8LSByZWFkX2NzdignVUtfc29jZGlzdF9mYl9udXRzMy5jc3YnKQoKZGZfdWtfc29jZGlzdCA8LSBkZl91a19zb2NkaXN0ICU+JSBzZWxlY3QoLXJ1bmRheSkgJT4lCiAgZmlsdGVyKGRhdGUgPj0gJzIwMjAtMDMtMDknICYgZGF0ZSA8PSAnMjAyMC0wMy0zMScpICU+JQogIGdyb3VwX2J5KG51dHMzKSAlPiUgCiAgbXV0YXRlKHRpbWUgPSByb3dfbnVtYmVyKCkpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgZHBseXI6OnJlbmFtZShwZXJzX28gPSBvcGVuLCAKICAgICAgICAgICAgICAgIHBlcnNfYyA9IHNjaSwKICAgICAgICAgICAgICAgIHBlcnNfZSA9IGV4dHJhLAogICAgICAgICAgICAgICAgcGVyc19hID0gYWdyZWUsCiAgICAgICAgICAgICAgICBwZXJzX24gPSBuZXVybykgJT4lIAogIHNlbGVjdCgtbnV0czNfbmFtZSkgJT4lIAogIGRwbHlyOjpyZW5hbWUoc29jZGlzdF90aWxlcyA9IGFsbF9kYXlfYmluZ190aWxlc192aXNpdGVkX3JlbGF0LAogICAgICAgICAgICAgICAgc29jZGlzdF9zaW5nbGVfdGlsZSA9IGFsbF9kYXlfcmF0aW9fc2luZ2xlX3RpbGVfdXNlcnMpICU+JQogIGRyb3BfbmEoKQogIApkZl91a19zb2NkaXN0ICU+JSBoZWFkKCkKCmBgYAoKIyMjIENvbnRyb2xzIApgYGB7cn0KZGZfdWtfY3RybF9udXRzIDwtIHJlYWRfY3N2KCJjb250cm9sc19VS19udXRzMy5jc3YiKQpkZl91a19jdHJsX251dHMgPC0gZGZfdWtfY3RybF9udXRzICU+JSBzZWxlY3QoLW51dHMzX25hbWUpCmRmX3VrX2N0cmxfbnV0cwoKZGZfdWtfY3RybF91dCA8LSByZWFkX2NzdigiY29udHJvbHNfVUtfdXQuY3N2IikKZGZfdWtfY3RybF91dCA8LSBkZl91a19jdHJsX3V0ICU+JSBzZWxlY3QoLXV0X25hbWUpCmRmX3VrX2N0cmxfdXQKCgpgYGAKCiMjIyBNZXJnZSBkYXRhIApgYGB7cn0KCmRmX3VrIDwtIGRmX3VrICU+JSBwbHlyOjpqb2luKGRmX3VrX2N0cmxfdXQsIGJ5PSd1dF9hcmVhJykKCmRmX3VrX3NvY2Rpc3QgPC0gZGZfdWtfc29jZGlzdCAlPiUgcGx5cjo6am9pbihkZl91a19jdHJsX251dHMsIGJ5PSdudXRzMycpCgoKYGBgCgoKIyMjIElkZW50aWZ5IExvbmRvbiBhcmVhcwpgYGB7cn0KCm51dHNfbG9uZG9uX2lubmVyIDwtIGMoJ1VLSTMxJywnVUtJMzInLCdVS0kzMycsJ1VLSTM0JywnVUtJNDEnLAogICAgICAgICAgICAgICAgICAgICAgJ1VLSTQyJywnVUtJNDMnLCdVS0k0NCcsJ1VLSTQ1JykKCm51dHNfbG9uZG9uX291dGVyIDwtIGMoJ1VLSTUxJywnVUtJNTInLCdVS0k1MycsJ1VLSTU0JywnVUtJNjEnLAogICAgICAgICAgICAgICAgICAgICAgJ1VLSTYyJywnVUtJNjMnLCdVS0k3MScsJ1VLSTcyJywnVUtJNzMnLAogICAgICAgICAgICAgICAgICAgICAgJ1VLSTc0JywnVUtJNzUnKQoKdXRfbG9uZG9uX2lubmVyIDwtIGMoJ0UwOTAwMDAwNycsJ0UwOTAwMDAwMScsJ0UwOTAwMDAzMycsJ0UwOTAwMDAxMycsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAyMCcsJ0UwOTAwMDAzMicsJ0UwOTAwMDAyNScsJ0UwOTAwMDAxMicsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAzMCcsJ0UwOTAwMDAxNCcsJ0UwOTAwMDAxOScsJ0UwOTAwMDAyMycsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAyOCcsJ0UwOTAwMDAyMicpCgp1dF9sb25kb25fb3V0ZXIgPC0gYygnRTA5MDAwMDExJywnRTA5MDAwMDA0JywnRTA5MDAwMDE2JywnRTA5MDAwMDAyJywKICAgICAgICAgICAgICAgICAgICAnRTA5MDAwMDMxJywnRTA5MDAwMDI2JywnRTA5MDAwMDEwJywnRTA5MDAwMDA2JywKICAgICAgICAgICAgICAgICAgICAnRTA5MDAwMDA4JywnRTA5MDAwMDI5JywnRTA5MDAwMDIxJywnRTA5MDAwMDI0JywKICAgICAgICAgICAgICAgICAgICAnRTA5MDAwMDAzJywnRTA5MDAwMDA1JywnRTA5MDAwMDA5JywnRTA5MDAwMDE3JywKICAgICAgICAgICAgICAgICAgICAnRTA5MDAwMDE1JywnRTA5MDAwMDE4JywnRTA5MDAwMDI3JykKYGBgCgpgYGB7cn0KCmRmX3VrID0gZGZfdWsgJT4lIAogIG11dGF0ZShsb25kb24gPSBpZmVsc2UodXRfYXJlYSAlaW4lIHV0X2xvbmRvbl9pbm5lciwgJ2xvbmRvbl9pbm5lcicsIAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1dF9hcmVhICVpbiUgdXRfbG9uZG9uX291dGVyLCAnbG9uZG9uX291dGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvdW50cnknKSkpICU+JQogIG11dGF0ZShsb25kb24gPSBhcy5mYWN0b3IobG9uZG9uKSkKCmRmX3VrX3NvY2Rpc3QgPSBkZl91a19zb2NkaXN0ICU+JSAKICBtdXRhdGUobG9uZG9uID0gaWZlbHNlKG51dHMzICVpbiUgbnV0c19sb25kb25faW5uZXIsICdsb25kb25faW5uZXInLCAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobnV0czMgJWluJSBudXRzX2xvbmRvbl9vdXRlciwgJ2xvbmRvbl9vdXRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3VudHJ5JykpKSAlPiUKICBtdXRhdGUobG9uZG9uID0gYXMuZmFjdG9yKGxvbmRvbikpCgpgYGAKCgojIEV4cGxvcmUgZGF0YQoKIyMjIFBsb3QgcHJldmFsZW5jZSBvdmVyIHRpbWUKYGBge3J9CgpkZl91ayAlPiUgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD11dF9hcmVhLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHByZXZhbGVuY2Ugb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl91ayAlPiUgbXV0YXRlKHByZXZfdGFpbCA9IGN1dCguW1tpXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYsIHF1YW50aWxlKC5bW2ldXSwgMC4yKSwgcXVhbnRpbGUoLltbaV1dLCAwLjgpLCBJbmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdsb3dlciB0YWlsJywgJ2NlbnRlcicsICd1cHBlciB0YWlsJykpKSAlPiUgCiAgZmlsdGVyKHByZXZfdGFpbCAhPSAnY2VudGVyJykgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD11dF9hcmVhLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIGZhY2V0X3dyYXAofnByZXZfdGFpbCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZShpKQoKcHJpbnQoZ2cpCn0KCmBgYAoKCiMjIyBQbG90IHNvY2lhbCBkaXN0YW5jaW5nIG92ZXIgdGltZQpgYGB7cn0KCmRmX3VrX3NvY2Rpc3QgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3RfdGlsZXMpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1udXRzMywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX3VrX3NvY2Rpc3QgJT4lIG11dGF0ZShzb2NkaXN0X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihzb2NkaXN0X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3RfdGlsZXMpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1udXRzMywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5zb2NkaXN0X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CgpgYGAKCiMjIyBFeHBsb3JlIGRpZmZlcmVuY2VzIGJldHdlZW4gbG9uZG9uIGFuZCB0aGUgcmVzdCAKYGBge3J9CgpkZl91ayAlPiUgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD11dF9hcmVhLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBmYWNldF93cmFwKH5sb25kb24pICsKICBnZ3RpdGxlKCJPdmVyYWxsIHByZXZhbGVuY2Ugb3ZlciB0aW1lIikKCgoKYGBgCgoKYGBge3J9CmRmX3VrX3NvY2Rpc3QgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3RfdGlsZXMpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1udXRzMywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZmFjZXRfd3JhcCh+bG9uZG9uKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyBvdmVyIHRpbWUiKQpgYGAKCgojIyMgQ29ycmVsYXRpb25zCmBgYHtyfQoKZGZfdWsgJT4lIGdyb3VwX2J5KHV0X2FyZWEpICU+JSAKICBzdW1tYXJpemVfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm09VCkgJT4lIAogIHNlbGVjdCgtdXRfYXJlYSwgLXRpbWUpICU+JSAKICBjb3IodXNlID0gJ3BhaXJ3aXNlLmNvbXBsZXRlJykgJT4lIHJvdW5kKDMpCgpkZl91awogCmBgYAoKIyBNb2RlbGxpbmcgCiMjIFByZXBhcmUgZnVuY3Rpb25zCgpgYGB7cn0KCiMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbGwgcmVsZXZhbnQgbW9kZWxzCnJ1bl9tb2RlbHMgPC0gZnVuY3Rpb24oeSwgbHZsMV94LCBsdmwyX3gsIGx2bDJfaWQsIGRhdGEsIGN0cmxzPUYpewoKICAjIHN1YnNldCBkYXRhCiAgZGF0YSA9IGRhdGEgJT4lIAogICAgZHBseXI6OnNlbGVjdChhbGxfb2YoeSksIGFsbF9vZihsdmwxX3gpLCBhbGxfb2YobHZsMl94KSwgYWxsX29mKGx2bDJfaWQpLCAKICAgICAgICAgICAgICAgICAgcG9wZGVucywgYWxsX29mKHkpKQogIGRhdGEgPSBkYXRhICU+JSAKICAgIGRwbHlyOjpyZW5hbWUoeSA9IGFsbF9vZih5KSwKICAgICAgICAgICBsdmwxX3ggPSBhbGxfb2YobHZsMV94KSwKICAgICAgICAgICBsdmwyX3ggPSBhbGxfb2YobHZsMl94KSwKICAgICAgICAgICBsdmwyX2lkID0gYWxsX29mKGx2bDJfaWQpCiAgICAgICAgICAgKQogIAogICMgY29uZmlndXJlIG9wdGltaXphdGlvbiBwcm9jZWR1cmUKICBjdHJsX2NvbmZpZyA8LSBsbWVDb250cm9sKG9wdCA9ICdvcHRpbScsIG1heEl0ZXIgPSAxMDAsIG1zTWF4SXRlciA9IDEwMCkKCiAgIyBiYXNlbGluZQogIGJhc2VsaW5lIDwtIGxtZShmaXhlZCA9IHkgfiAxLCByYW5kb20gPSB+IDEgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCgogICMgcmFuZG9tIGludGVyY2VwdCBmaXhlZCBzbG9wZQogIHJhbmRvbV9pbnRlcmNlcHQgPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCArIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAxIHwgbHZsMl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQoKICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgcmFuZG9tX3Nsb3BlIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogIGludGVyYWN0aW9uIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogIHJlc3VsdHMgPC0gbGlzdCgnYmFzZWxpbmUnID0gYmFzZWxpbmUsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbiIgPSBpbnRlcmFjdGlvbikKICAKICAKICBpZiAoY3RybHMgPT0gJ2RlbScgfCBjdHJscyA9PSAncHJldicpewogICAgCiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgICByYW5kb21fc2xvcGVfY3RybF9kZW0gPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCArIGx2bDJfeCArIHBvcGRlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgICBpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBsdmwxX3ggKiBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKSAgICAgICAgCiAgICAKICAgICMgY3JlYXRlIGxpc3Qgd2l0aCByZXN1bHRzCiAgICByZXN1bHRzIDwtIGxpc3QoJ2Jhc2VsaW5lJyA9IGJhc2VsaW5lLCAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlIiA9IHJhbmRvbV9zbG9wZSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb24iID0gaW50ZXJhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZV9jdHJsX2RlbSIgPSByYW5kb21fc2xvcGVfY3RybF9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0iID0gaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfaW50X2RlbSkKICB9CiAgCiAgaWYgKGN0cmxzID09ICdwcmV2Jyl7CiAgCiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgICByYW5kb21fc2xvcGVfY3RybF9wcmV2IDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3ggKyBwb3BkZW5zICsgcmF0ZV9kYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94ICsgcmF0ZV9kYXkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykgIAogICAgCiAgICAgICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9tYWluX3ByZXYgPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCAqIGx2bDJfeCArIHBvcGRlbnMgKyByYXRlX2RheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAKICAgICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICAgIGludGVyYWN0aW9uX2N0cmxfaW50X3ByZXY8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94ICsgbHZsMV94ICogcG9wZGVucyArIHJhdGVfZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94ICsgcmF0ZV9kYXkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogICAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9pbnRlcmNlcHQiID0gcmFuZG9tX2ludGVyY2VwdCwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGVfY3RybF9kZW0iID0gcmFuZG9tX3Nsb3BlX2N0cmxfZGVtLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfaW50X2RlbSIgPSBpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0sICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2N0cmxfcHJldiIgPSByYW5kb21fc2xvcGVfY3RybF9wcmV2LAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX21haW5fcHJldiIgPSBpbnRlcmFjdGlvbl9jdHJsX21haW5fcHJldiwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9pbnRfcHJldiIgPSBpbnRlcmFjdGlvbl9jdHJsX2ludF9wcmV2KQogIH0KICAKICBpZihjdHJscyA9PSAnZXhwJyl7CiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgcmFuZG9tX3Nsb3BlX2V4cCA8LSBsbWUoZml4ZWQgPSB5IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSArIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogIGludGVyYWN0aW9uX2V4cCA8LSBsbWUoZml4ZWQgPSB5IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSAqIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykgIAogIAogIAogICMgY3JlYXRlIGxpc3Qgd2l0aCByZXN1bHRzCiAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICJyYW5kb21faW50ZXJjZXB0IiA9IHJhbmRvbV9pbnRlcmNlcHQsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlIiA9IHJhbmRvbV9zbG9wZSwKICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uLCAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2V4cCIgPSByYW5kb21fc2xvcGVfZXhwLAogICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fZXhwIiA9IGludGVyYWN0aW9uX2V4cCkKICB9CiAgCiAgcmV0dXJuKHJlc3VsdHMpCiAgICAgICAgCn0KCiMgZXh0cmFjdHMgdGFibGUgd2l0aCBjb2VmZmljaWVudHMgYW5kIHRlc3RzIHN0YXRpc3RpY3MKZXh0cmFjdF9yZXN1bHRzIDwtIGZ1bmN0aW9uKG1vZGVscykgewogIAogIG1vZGVsc19zdW1tYXJ5IDwtIG1vZGVscyAlPiUgCiAgbWFwKHN1bW1hcnkpICU+JSAKICBtYXAoInRUYWJsZSIpICU+JSAKICBtYXAoYXMuZGF0YS5mcmFtZSkgJT4lIAogIG1hcChyb3VuZCwgMTApIAogICMgJT4lIG1hcCh+IC5bc3RyX2RldGVjdChyb3duYW1lcyguKSwgJ0ludGVyfGx2bCcpLF0pCiAgCiAgcmV0dXJuKG1vZGVsc19zdW1tYXJ5KQogIAp9CgoKIyBjYWxjdWxhdGVzIGNvbXBhcmlzb24gb2YgYWxsIG1vZGVscyBpbiBtb2RlbCBsaXN0CmNvbXBhcmVfbW9kZWxzIDwtIGZ1bmN0aW9uKG1vZGVscykgewoKICBtZGxfbmFtZXMgPC0gbW9kZWxzICU+JSBuYW1lcygpCiAgCiAgc3RyID0gJycKICBmb3IgKGkgaW4gbWRsX25hbWVzKXsKICAgIAogICAgbWRsX3N0ciA8LSBwYXN0ZSgnbW9kZWxzJCcsIGksIHNlcCA9ICcnKQogICAgCiAgICBpZihpID09ICdiYXNlbGluZScpewogICAgICBzdHIgPC0gbWRsX3N0cgogICAgfWVsc2V7CiAgICBzdHIgPC0gcGFzdGUoc3RyLCBtZGxfc3RyLCBzZXA9JywgJykKICAgIH0KICB9CiAgCiAgYW5vdmFfc3RyIDwtIHBhc3RlMCgnYW5vdmEoJywgc3RyLCAnKScpCiAgbWRsX2NvbXAgPC0gZXZhbChwYXJzZSh0ZXh0PWFub3ZhX3N0cikpCiAgcm93bmFtZXMobWRsX2NvbXApID0gbWRsX25hbWVzCiAgcmV0dXJuKG1kbF9jb21wKQp9CgoKYGBgCgojIyBSZW1vdmUgTG9uZG9uIERhdGEgCmBgYHtyfQpkZl91ayA8LSBkZl91ayAlPiUgZmlsdGVyKGxvbmRvbiA9PSAnY291bnRyeScpCmRmX3VrX3NvY2Rpc3QgPC0gZGZfdWtfc29jZGlzdCAlPiUgZmlsdGVyKGxvbmRvbiA9PSAnY291bnRyeScpCgpgYGAKCgoKIyMgUmVzY2FsZSBEYXRhCmBgYHtyfQpkZl91a19zY2FsZWQgPC0gZGZfdWsgJT4lIGRwbHlyOjpzZWxlY3QodXRfYXJlYSwgdGltZSwgcGVyc19vLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19jLCBwZXJzX2UsIHBlcnNfZSwgcGVyc19hLCBwZXJzX24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMsIHJhdGVfZGF5KSAlPiUKICBtdXRhdGVfYXQodmFycygtdXRfYXJlYSwgLXRpbWUpLCBzY2FsZSkKCmRmX3VrX3NjYWxlZCAlPiUgaGVhZCgpCgoKZGZfdWtfc29jZGlzdF9zY2FsZWQgPC0gZGZfdWtfc29jZGlzdCAlPiUgZHBseXI6OnNlbGVjdChudXRzMywgdGltZSwgcGVyc19vLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19jLCBwZXJzX2UsIHBlcnNfZSwgcGVyc19hLCBwZXJzX24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMsIHNvY2Rpc3RfdGlsZXMpICU+JQogIG11dGF0ZV9hdCh2YXJzKC1udXRzMywgLXRpbWUpLCBzY2FsZSkKCmRmX3VrX3NvY2Rpc3Rfc2NhbGVkICU+JSBoZWFkKCkKCmBgYAoKCiMjIFByZWRpY3QgcHJldmFsZW5jZQojIyMgcHJldmFsZW5jZSB+IG9wZW5uZXNzCmBgYHtyfQoKbW9kZWxzX29fY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19vJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ3V0X2FyZWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19vX2NvdmlkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX29fY292aWQpCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9Cgptb2RlbHNfY19jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2MnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2NfY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfY19jb3ZpZCkKCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gZXh0cmF2ZXJzaW9uCmBgYHtyfQoKbW9kZWxzX2VfY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ3V0X2FyZWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19lX2NvdmlkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2VfY292aWQpCgoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGFncmVlYWJsZW5lc3MKYGBge3J9Cgptb2RlbHNfYV9jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2FfY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfYV9jb3ZpZCkKCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gbmV1cm90aWNpc20KYGBge3J9Cgptb2RlbHNfbl9jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX24nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX25fY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfbl9jb3ZpZCkKCgpgYGAKCgojIyBQcmVkaWN0IHNvY2lhbCBkaXN0YW5jaW5nCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IG9wZW5uZXNzCmBgYHtyfQoKbW9kZWxzX29fc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3RpbGVzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdudXRzMycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NvY2Rpc3Rfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfb19zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX29fc29jZGlzdCkKCmBgYAoKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9Cgptb2RlbHNfY19zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3RfdGlsZXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19jJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ251dHMzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc29jZGlzdF9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19jX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfY19zb2NkaXN0KQoKCmBgYAoKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gZXh0cmF2ZXJzaW9uCmBgYHtyfQoKbW9kZWxzX2Vfc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3RpbGVzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdudXRzMycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NvY2Rpc3Rfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfZV9zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2Vfc29jZGlzdCkKCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IGFncmVlYWJsZW5lc3MKYGBge3J9Cgptb2RlbHNfYV9zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3RfdGlsZXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19hJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ251dHMzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc29jZGlzdF9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfYV9zb2NkaXN0KQoKCmBgYAoKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gbmV1cm90aWNpc20KYGBge3J9Cgptb2RlbHNfbl9zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3RfdGlsZXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19uJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ251dHMzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc29jZGlzdF9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19uX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfbl9zb2NkaXN0KQoKCmBgYAoKCiMjIEV4cGxvcmUgcXVhZHJhdGljIHRyZW5kcyAKCiMjIyBwcmV2YWxlbmNlIH4gb3Blbm5lc3MKYGBge3J9Cgptb2RlbHNfb19jb3ZpZF9leHAgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbycsCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ3V0X2FyZWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX29fY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX29fY292aWRfZXhwKQoKYGBgCgoKIyMgcHJldmFsZW5jZSB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKbW9kZWxzX2NfY292aWRfZXhwIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZXhwJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfY19jb3ZpZF9leHApCgpjb21wYXJlX21vZGVscyhtb2RlbHNfY19jb3ZpZF9leHApCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gZXh0cmF2ZXJzaW9uCmBgYHtyfQoKbW9kZWxzX2VfY292aWRfZXhwIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZXhwJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfZV9jb3ZpZF9leHApCgpjb21wYXJlX21vZGVscyhtb2RlbHNfZV9jb3ZpZF9leHApCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gYWdyZWVhYmxlbmVzcwpgYGB7cn0KCm1vZGVsc19hX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2FfY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2FfY292aWRfZXhwKQoKYGBgCgojIyMgcHJldmFsZW5jZSB+IG5ldXJvdGljaXNtCmBgYHtyfQoKbW9kZWxzX25fY292aWRfZXhwIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZXhwJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfbl9jb3ZpZF9leHApCgpjb21wYXJlX21vZGVscyhtb2RlbHNfbl9jb3ZpZF9leHApCgpgYGAKCiMjIENyZWF0ZSBvdmVydmlldyB0YWJsZSAKCiMjIyBEZWZpbmUgZnVuY3Rpb24gdG8gY3JlYXRlIG92ZXJ2aWV3IHRhYmxlcwpgYGB7cn0KCnN1bW1hcnlfdGFibGUgPC0gZnVuY3Rpb24obW9kZWxzLCBkdl9uYW1lKXsKCiAgdGVtcF9kZl9jdHJsX21haW4gPC0gTlVMTAogIHRlbXBfZGZfY3RybF9pbnQgPC0gTlVMTAogIAogIGZvciAoaSBpbiBtb2RlbHMpewogICAgcmVzdWx0cyA8LSBpICU+JSBleHRyYWN0X3Jlc3VsdHMoKQogICAgCiAgICByZXN1bHRzX2N0cmxfbWFpbiA8LSByZXN1bHRzJGludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW1bJ2x2bDFfeDpsdmwyX3gnLF0KICAgIHRlbXBfZGZfY3RybF9tYWluIDwtIHRlbXBfZGZfY3RybF9tYWluICU+JSByYmluZChyZXN1bHRzX2N0cmxfbWFpbikKICAgIAogICAgcmVzdWx0c19jdHJsX2ludCA8LSByZXN1bHRzJGludGVyYWN0aW9uX2N0cmxfaW50X2RlbVsnbHZsMV94Omx2bDJfeCcsXQogICAgdGVtcF9kZl9jdHJsX2ludCA8LSB0ZW1wX2RmX2N0cmxfaW50ICU+JSByYmluZChyZXN1bHRzX2N0cmxfaW50KQogIH0KICAKICBuYW1lc19jdHJsX21haW4gPC0gcGFzdGUwKGR2X25hbWUsICd+JywgYygnbycsICdjJywgJ2UnLCAnYScsICduJyksICcqdGltZScsICdfY3J0bF9wb3BkZW5zJykKICBuYW1lc19jdHJsX2ludCA8LSBwYXN0ZTAoZHZfbmFtZSwgJ34nLCBjKCdvJywgJ2MnLCAnZScsICdhJywgJ24nKSwgJyp0aW1lJywgJ19jcnRsX3BvcGRlbnMqdGltZScpCgogIHJvd25hbWVzKHRlbXBfZGZfY3RybF9tYWluKSA8LSBuYW1lc19jdHJsX21haW4KICByb3duYW1lcyh0ZW1wX2RmX2N0cmxfaW50KSA8LSBuYW1lc19jdHJsX2ludAogIAogIHN1bV90YWIgPC0gcmJpbmQodGVtcF9kZl9jdHJsX21haW4sIHRlbXBfZGZfY3RybF9pbnQpICU+JSByb3VuZCg0KQogIAogIHJldHVybihzdW1fdGFiKQoKfSAKCmBgYAoKIyMjIENyZWF0ZSBvdmVydmlldyB0YWJsZXMKYGBge3J9CiMgcHJldmFsZW5jZQptb2RlbHNfcHJldiA8LSBsaXN0KG1vZGVsc19vX2NvdmlkLCAKICAgICAgICAgICAgICAgICAgICBtb2RlbHNfY19jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX2VfY292aWQsIAogICAgICAgICAgICAgICAgICAgIG1vZGVsc19hX2NvdmlkLCAKICAgICAgICAgICAgICAgICAgICBtb2RlbHNfbl9jb3ZpZCkKCnN1bV90YWJfcHJldiA8LSBzdW1tYXJ5X3RhYmxlKG1vZGVsc19wcmV2LCBkdl9uYW1lID0gJ3ByZXYnKQoKd3JpdGUudGFibGUoc3VtX3RhYl9wcmV2LCBxdW90ZT1GKQoKIyBzb2NpYWwgZGlzdGFuY2luZwptb2RlbHNfc29jZGlzdCA8LSBsaXN0KG1vZGVsc19vX3NvY2Rpc3QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19jX3NvY2Rpc3QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19lX3NvY2Rpc3QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19hX3NvY2Rpc3QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19uX3NvY2Rpc3QpCgpzdW1fdGFiX3NvY2Rpc3QgPC0gc3VtbWFyeV90YWJsZShtb2RlbHNfc29jZGlzdCwgZHZfbmFtZSA9ICdzb2NkaXN0JykKCndyaXRlLnRhYmxlKHN1bV90YWJfc29jZGlzdCwgcXVvdGU9RikKCgoKYGBgCgoKCgoKIyBDb25kaXRpb25hbCByYW5kb20gZm9yZXN0IGFuYWx5c2lzIAoKIyMjIEV4dHJhY3Qgc2xvcGVzIHByZXZhbGVuY2UKYGBge3J9CgojIHNsb3BlIHByZXZhbGVuY2UKZGZfdWtfc2xvcGVfcHJldiA8LSBkZl91ayAlPiUgc3BsaXQoLiR1dF9hcmVhKSAlPiUgCiAgbWFwKH4gbG0ocmF0ZV9kYXkgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChjb2VmKSAlPiUgCiAgbWFwX2RibCgndGltZScpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndXRfYXJlYScpICU+JSAKICByZW5hbWUoc2xvcGVfcHJldiA9ICcuJykKCiMgbWVyZ2Ugd2l0aCBjb250cm9sIHZhcmlhYmxlcyAKZGZfdWtfc2xvcGVfcHJldiA8LSBkZl91ayAlPiUgc2VsZWN0KC10aW1lLCAtcmF0ZV9kYXkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGlubmVyX2pvaW4oZGZfdWtfc2xvcGVfcHJldiwgYnkgPSAndXRfYXJlYScpCgpoZWFkKGRmX3VrX3Nsb3BlX3ByZXYpCgpgYGAKCgojIyMgRXh0cmFjdCBzbG9wZXMgc29jaWFsIGRpc3RhbmNpbmcKYGBge3J9CgojIHNsb3BlIHNvY2Rpc3QKZGZfdWtfc2xvcGVfc29jZGlzdCA8LSBkZl91a19zb2NkaXN0ICU+JSBzcGxpdCguJG51dHMzKSAlPiUKICBtYXAofiBsbShzb2NkaXN0X3RpbGVzIH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAoY29lZikgJT4lCiAgbWFwX2RibCgndGltZScpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oJ251dHMzJykgJT4lCiAgcmVuYW1lKHNsb3BlX3NvY2Rpc3QgPSAnLicpCgojIG1lcmdlIHdpdGggY29udHJvbCB2YXJpYWJsZXMgCmRmX3VrX3Nsb3BlX3NvY2Rpc3QgPC0gZGZfdWtfc29jZGlzdCAlPiUgc2VsZWN0KC10aW1lLCAtZGF0ZSwgLXNvY2Rpc3RfdGlsZXMsIC1hbGxfZGF5X3JhdGlvX3NpbmdsZV90aWxlX3VzZXJzKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGlubmVyX2pvaW4oZGZfdWtfc2xvcGVfc29jZGlzdCwgYnkgPSAnbnV0czMnKQoKaGVhZChkZl91a19zbG9wZV9zb2NkaXN0KQoKYGBgCgojIyMgRXhwbG9yZSBkaXN0cmlidXRpb24gb2Ygc2xvcGVzCmBgYHtyfQpkZl91a19zbG9wZV9wcmV2ICU+JSBnZ3Bsb3QoYWVzKHNsb3BlX3ByZXYpKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApCgpkZl91a19zbG9wZV9zb2NkaXN0ICU+JSBnZ3Bsb3QoYWVzKHNsb3BlX3NvY2Rpc3QpKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApCgpgYGAK